{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[ 1.0000000e+00,  0.0000000e+00,  0.0000000e+00],\n",
       "        [ 4.4408921e-16,  1.0000000e+00,  4.4408921e-16],\n",
       "        [ 0.0000000e+00, -4.4408921e-16,  1.0000000e+00]])"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.matrix([[1,2,3],[5,5,6],[7,9,9]])\n",
    "a*a**-1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [2],\n",
       "       [3]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([1,2,3])\n",
    "a.reshape(-1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.reshape([1,-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  1],\n",
       "        [ 2,  3],\n",
       "        [ 4,  5]],\n",
       "\n",
       "       [[ 6,  7],\n",
       "        [ 8,  9],\n",
       "        [10, 11]]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.arange(12).reshape(2,3,2)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[12, 13, 14],\n",
       "        [15, 16, 17]],\n",
       "\n",
       "       [[18, 19, 20],\n",
       "        [21, 22, 23]]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = np.arange(12, 24).reshape(2,2,3)\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[[ 15,  16,  17],\n",
       "         [ 21,  22,  23]],\n",
       "\n",
       "        [[ 69,  74,  79],\n",
       "         [ 99, 104, 109]],\n",
       "\n",
       "        [[123, 132, 141],\n",
       "         [177, 186, 195]]],\n",
       "\n",
       "\n",
       "       [[[177, 190, 203],\n",
       "         [255, 268, 281]],\n",
       "\n",
       "        [[231, 248, 265],\n",
       "         [333, 350, 367]],\n",
       "\n",
       "        [[285, 306, 327],\n",
       "         [411, 432, 453]]]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = np.dot(a, b)\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.alltrue(c[0,:,0,:] == np.dot(a[0],b[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.alltrue( c[1,:,0,:] == np.dot(a[1], b[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.alltrue( c[0, :, 1, :] == np.dot(a[0], b[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.alltrue( c[1, :, 1, :] == np.dot(a[1], b[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 3, 2, 3)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.arange(12).reshape(2,3,2)\n",
    "b = np.arange(12, 24).reshape(2,3,2)\n",
    "c = np.inner(a, b)\n",
    "c.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[0,0,0,0] == np.inner(a[0,0], b[0,0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[0, 1, 1, 0] == np.inner(a[0, 1], b[1, 0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[1,2,1,2] == np.inner(a[1, 2], b[1,2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4,  5,  6,  7],\n",
       "       [ 8, 10, 12, 14],\n",
       "       [12, 15, 18, 21]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.outer([1,2,3], [4,5,6,7])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.6637359812630166e-15\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 1.25447748, -4.67373763, -2.21215617,  4.47593024,  1.62312012,\n",
       "       -2.17012662,  2.00094734,  0.51718993,  3.09158616, -1.71916826])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.random.rand(10, 10)\n",
    "b = np.random.rand(10)\n",
    "x = np.linalg.solve(a, b)\n",
    "print(np.sum(np.abs(np.dot(a,x) - b)))\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<module 'numpy_lstsq' from '/home/xacrb/ws/science-compute-with-python/numpy/numpy_lstsq.py'>"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from numpy_lstsq import *\n",
    "import imp\n",
    "imp.reload(numpy_lstsq)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from numpy.lib.stride_tricks import as_strided\n",
    "\n",
    "def make_data(M, N, noise_scale):\n",
    "    x = np.random.standard_normal(M)\n",
    "    h = np.random.standard_normal(N)\n",
    "    y = np.convolve(x, h)\n",
    "    yn = y + np.random.standard_normal(len(y)) * noise_scale * np.max(y)\n",
    "    return x, yn, h\n",
    "\n",
    "\n",
    "\n",
    "def solve_h(x, y, N):\n",
    "    X = as_strided(x, shape=(len(x) - N+1, N), strides = (x.itemsize, x.itemsize))\n",
    "    Y = y[N-1:len(x)]\n",
    "    h = np.linalg.lstsq(X, Y)\n",
    "    return h[0][::-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-1.89237522e+00 -1.23023039e+00 -1.10733210e+00 -8.49508616e-01\n",
      "  3.09626751e-01  9.13658172e-01  6.89480293e-01  2.37682269e-01\n",
      "  1.77927999e+00  1.41850780e+00 -9.11003040e-01  1.27574617e-02\n",
      " -6.71000514e-04  4.19333720e-01  8.35636730e-01 -1.58108220e-01\n",
      "  7.76138148e-02 -1.57550870e+00  7.94444593e-01 -4.42328963e-01\n",
      " -1.46560330e+00  1.52550654e+00  4.55831608e-01  1.46894258e+00\n",
      "  1.28312266e+00  1.63698546e+00  2.05129349e-01  6.86466138e-01\n",
      "  2.23586976e-01 -1.42977943e+00  2.88563347e-01  5.53376850e-01\n",
      "  9.15526035e-01  2.00372331e+00  1.85595506e-01 -1.89004704e-01\n",
      " -2.79129486e-01 -5.46282378e-02 -3.13127571e-01  8.44056095e-01\n",
      " -4.34740129e-01 -1.13613009e+00 -2.32573424e+00 -8.47328963e-01\n",
      " -2.56426672e-01  2.39415808e+00  1.40291649e-01 -7.75602115e-01\n",
      "  8.25060122e-02  2.24848590e-01 -1.81158679e+00 -1.21278218e+00\n",
      " -1.05214204e+00  1.07008688e+00  5.90744308e-01 -3.66520358e-01\n",
      " -1.14957552e+00 -1.89928167e+00  5.22451944e-01  3.48548473e-01\n",
      " -3.68562119e-01  6.40423955e-01 -1.11124397e+00 -2.27895187e-01\n",
      " -7.37169053e-01 -1.02475341e+00  1.66632591e+00 -3.90419005e-01\n",
      "  2.65814847e-01  3.25568033e+00  3.11224298e-01 -6.84626443e-01\n",
      " -1.02366984e+00 -2.31152717e-01  6.29823953e-01 -3.66050682e-01\n",
      "  6.65216932e-01 -1.32552024e-02  6.82464930e-01  1.33211293e+00\n",
      "  2.88516591e-01  5.72783220e-01  2.39343621e+00  1.03441438e+00\n",
      "  1.50848361e+00 -2.54693304e-01 -1.69370947e+00  4.65403817e-01\n",
      " -3.44724412e-01 -3.11993453e-01 -3.63166829e-01  3.83300570e-01\n",
      " -1.34665095e-01 -1.20895692e+00 -1.75371725e-02 -3.45045345e-01\n",
      "  3.41676421e-01 -7.01670612e-01  1.35397190e+00 -1.23081692e+00]\n",
      "[-1.42677412 -1.00247547 -1.2698982  -0.14656191 -0.41229187  1.34780142\n",
      "  0.84375663  0.28564527  1.67422695  1.63462352 -0.80342595  0.53234761\n",
      " -0.19763353  0.17655624  0.91534514  0.6017951   0.71504857 -2.10030002\n",
      "  0.30743298 -0.72554877 -0.85648308  0.78643122  0.8537324   1.08706951\n",
      "  1.13150101  1.89236214  0.46478535  0.05491407  0.69576894 -1.73958605\n",
      " -0.66529905  0.74049748  1.07416742  2.74139874  0.31071602  0.04570153\n",
      "  0.19902056  0.08304437 -0.51975814  1.69866711 -0.83221287 -1.66388439\n",
      " -1.60482247 -0.77143342 -0.34440755  2.39097224  0.29293124 -0.52046011\n",
      "  0.55342096 -0.12374127 -2.35050001 -1.31685637 -0.75456368  0.68919084\n",
      "  0.79322541 -0.45336423 -1.71057137 -1.58550007 -0.05542233  0.49672803\n",
      " -0.48035536  0.65548117 -1.41223912 -0.55411043 -0.7156874  -0.77517409\n",
      "  1.91884759 -0.57002196  0.96899772  2.83014164  0.69365815 -0.89538291\n",
      " -1.30874264 -0.25492636  0.65244878  0.37985383  1.65258729  0.07499093\n",
      " -0.02614536  1.5309946   0.8850217   0.71753636  2.21080575  0.88814754\n",
      "  2.1340321  -0.80057223 -1.59001326 -0.08976188 -0.48724284 -0.59851941\n",
      " -0.85785995  0.69487322  0.05247175 -1.12752929 -0.1354407  -0.10951054\n",
      "  0.84391004 -1.31153754  1.61878717 -1.8514133   0.67859642  0.33737391\n",
      " -0.02112767 -0.35666319 -0.36384962  0.43615471 -0.0405617   0.48124772\n",
      "  0.01745963  0.1835996  -0.39230886  0.12760919 -0.28011983 -0.62315978\n",
      "  0.43061949 -0.28028843  0.12655186 -0.13163072  0.06113375  0.80736952]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/xacrb/ws/science-compute-with-python/numpy/numpy_lstsq.py:17: FutureWarning: `rcond` parameter will change to the default of machine precision times ``max(M, N)`` where M and N are the input matrix dimensions.\n",
      "To use the future default and silence this warning we advise to pass `rcond=None`, to keep using the old, explicitly pass `rcond=-1`.\n",
      "  h = np.linalg.lstsq(X, Y)\n"
     ]
    }
   ],
   "source": [
    "x, yn, h = numpy_lstsq.make_data(1000, 100, 0.4)\n",
    "H = numpy_lstsq.solve_h(x, yn, 120)\n",
    "print(H)\n",
    "H2 = numpy_lstsq.solve_h(x, yn, 80)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pylab as pl\n",
    "pl.plot(range(0, 120), H)\n",
    "pl.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pylab as pl\n",
    "pl.plot(range(0, 80), H2)\n",
    "pl.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "masked_array(data=[--, --, --, 5, 7, --, --, --, 8, --],\n",
       "             mask=[ True,  True,  True, False, False,  True,  True,  True,\n",
       "                   False,  True],\n",
       "       fill_value=999999)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy.ma as ma\n",
    "x = np.array([1,2,3,5,7,4,3,2,8,0])\n",
    "mask = x < 5\n",
    "mx = ma.array(x, mask=mask)\n",
    "mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6.666666666666667\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "6.666666666666667"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(mx.mean())\n",
    "ma.mean(mx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6.666666666666667"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(x[~mask])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6.666666666666667"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(mx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(6.5)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.cov(mx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "masked_array(data=2.333333333333333,\n",
       "             mask=False,\n",
       "       fill_value=1e+20)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ma.cov(mx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1, -1, -1,  5,  7, -1, -1, -1,  8, -1])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mx.fill_value = -1\n",
    "mx.filled()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "masked_array(data=[--, --, --, 5],\n",
       "             mask=[ True,  True,  True, False],\n",
       "       fill_value=-1)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(mx[0])\n",
    "mx[:4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mx[0] = 3\n",
    "mx[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "masked"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mx[3] = ma.masked\n",
    "mx[3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "masked_array(data=[0.07950827, 0.07886955, 0.07840778],\n",
       "             mask=False,\n",
       "       fill_value=1e+20)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.random.normal(size=(3, 10000))\n",
    "mx = ma.masked_outside(x, 0, 1)\n",
    "mx.var(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9811309 , 0.99366348, 1.00435184])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.var(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.arange(0, 12)\n",
    "a.shape = 3,4\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "a.tofile(\"a.bin\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.0e+000, 4.9e-324, 9.9e-324, 1.5e-323, 2.0e-323, 2.5e-323,\n",
       "       3.0e-323, 3.5e-323, 4.0e-323, 4.4e-323, 4.9e-323, 5.4e-323])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = np.fromfile(\"a.bin\", dtype=np.float)\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "int64\n"
     ]
    }
   ],
   "source": [
    "print(a.dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = np.fromfile(\"a.bin\", dtype=np.int64)\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b.shape = 3, 4\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.save(\"a.npy\", a)\n",
    "c = np.load(\"a.npy\")\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1,2,3], [4,5,6]])\n",
    "b = np.arange(0, 1.0, 0.1)\n",
    "c = np.sin(b)\n",
    "np.savez(\"result.npz\", a, b, sin_array = c)\n",
    "r = np.load(\"result.npz\")\n",
    "r[\"arr_0\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[\"arr_1\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.        , 0.09983342, 0.19866933, 0.29552021, 0.38941834,\n",
       "       0.47942554, 0.56464247, 0.64421769, 0.71735609, 0.78332691])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[\"sin_array\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0. ,  0.5,  1. ,  1.5,  2. ,  2.5],\n",
       "       [ 3. ,  3.5,  4. ,  4.5,  5. ,  5.5],\n",
       "       [ 6. ,  6.5,  7. ,  7.5,  8. ,  8.5],\n",
       "       [ 9. ,  9.5, 10. , 10.5, 11. , 11.5]])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.arange(0, 12, 0.5).reshape(4, -1)\n",
    "np.savetxt(\"a.txt\", a)\n",
    "np.loadtxt(\"a.txt\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  0.,  1.,  1.,  2.,  2.],\n",
       "       [ 3.,  3.,  4.,  4.,  5.,  5.],\n",
       "       [ 6.,  6.,  7.,  7.,  8.,  8.],\n",
       "       [ 9.,  9., 10., 10., 11., 11.]])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.savetxt(\"a.txt\", a, fmt=\"%d\", delimiter=\",\")\n",
    "np.loadtxt(\"a.txt\", delimiter=\",\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 30.,  75., 165.],\n",
       "       [ 45.,  60., 170.],\n",
       "       [ 15.,  30., 120.]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tmp = np.loadtxt(\"test.csv\", dtype=np.str, delimiter=\",\")\n",
    "data = tmp[1:,1:].astype(np.float)\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(b'zhangsan', 30, 75., 165.) (b'lisi', 45, 60., 170.)\n",
      " (b'wangwu', 15, 30., 120.)]\n"
     ]
    }
   ],
   "source": [
    "f = open('test.csv', 'r')\n",
    "persontype = np.dtype({\n",
    "    'names': ['name', 'age', 'weight', 'height'],\n",
    "    'formats': ['S32', 'i', 'f', 'f']\n",
    "})\n",
    "f.readline()\n",
    "data = np.loadtxt(f, delimiter=\",\", dtype=persontype)\n",
    "print(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.arange(8)\n",
    "b = np.add.accumulate(a)\n",
    "c = a + b\n",
    "f = open(\"result.npy\", \"wb\")\n",
    "np.save(f, a)\n",
    "np.save(f, b)\n",
    "np.save(f, c)\n",
    "f.close()\n",
    "f = open(\"result.npy\", \"rb\")\n",
    "np.load(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  3,  6, 10, 15, 21, 28])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.load(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  2,  5,  9, 14, 20, 27, 35])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.load(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "memmap([[0, 0, 0, 0, 0],\n",
       "        [0, 0, 0, 0, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.memmap(\"tmp.dat\", mode=\"w+\", shape=(2,5))\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "open(\"tmp.dat\").read()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "a[:] = ord(\"a\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'aaaaaaaaaa'"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.flush()\n",
    "open(\"tmp.dat\").read()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "memmap([[97, 97, 97, 97, 97],\n",
       "        [97, 97, 97, 97, 97]], dtype=uint8)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = np.memmap(\"tmp.dat\", mode=\"c\", shape=(2,5))\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "memmap([[97, 97, 97, 97, 97],\n",
       "        [98, 98, 98, 98, 98]], dtype=uint8)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[1] = ord(\"b\")\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'aaaaaaaaaa'"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b.flush()\n",
    "open(\"tmp.dat\").read()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'aaaaaccccc'"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = np.memmap(\"tmp.dat\", shape=(2,5))\n",
    "c[1] = ord(\"c\")\n",
    "c.flush()\n",
    "open(\"tmp.dat\").read()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "memmap([[97, 97, 97, 97, 97],\n",
       "        [99, 99, 99, 99, 99]], dtype=uint8)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "memmap([[97, 97, 97, 97, 97],\n",
       "        [98, 98, 98, 98, 98]], dtype=uint8)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "bmp = np.memmap(\"tmp.bmp\", mode=\"w+\", offset=54, shape=(1000,1000,3))\n",
    "tmp = np.linspace(0, 255,1000).astype(np.uint8)\n",
    "bmp[:,:,0] = tmp\n",
    "bmp[:,:,1] = tmp.reshape(-1, 1)\n",
    "bmp[:,:,2] = 127\n",
    "bmp.flush()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
